package br.com.ac.fatureweb.service;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.FlushModeType;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.ac.fatureweb.enums.EnumStatusCarga;
import br.com.ac.fatureweb.integration.enums.EnumConsumoZerado;
import br.com.ac.fatureweb.integration.enums.EnumSituacaoLigacao;
import br.com.ac.fatureweb.integration.model.AnaliseAguaVO;
import br.com.ac.fatureweb.integration.model.AvisoDebitoVO;
import br.com.ac.fatureweb.integration.model.ConfiguracaoCalculoVO;
import br.com.ac.fatureweb.integration.model.ConfiguracaoSaaeVO;
import br.com.ac.fatureweb.integration.model.DebitoVO;
import br.com.ac.fatureweb.integration.model.EconomiaVO;
import br.com.ac.fatureweb.integration.model.FaixaVO;
import br.com.ac.fatureweb.integration.model.HistoricoVO;
import br.com.ac.fatureweb.integration.model.ImovelVO;
import br.com.ac.fatureweb.integration.model.LancamentoFuturoVO;
import br.com.ac.fatureweb.integration.model.MensagemVO;
import br.com.ac.fatureweb.integration.model.OcorrenciaVO;
import br.com.ac.fatureweb.integration.model.OcorrenciaVO.EnumTypeCobranca;
import br.com.ac.fatureweb.integration.model.SaldoDebitoCreditoVO;
import br.com.ac.fatureweb.integration.model.SaldoDebitoCreditoVO.EnumTypeSaldo;
import br.com.ac.fatureweb.integration.model.TarifaSocialVO;
import br.com.ac.fatureweb.integration.model.TarifaVO;
import br.com.ac.fatureweb.jf.model.Aviso_Debito;
import br.com.ac.fatureweb.jf.model.Calculo;
import br.com.ac.fatureweb.jf.model.Configuracao;
import br.com.ac.fatureweb.jf.model.Debitos;
import br.com.ac.fatureweb.jf.model.Economias;
import br.com.ac.fatureweb.jf.model.Ficha;
import br.com.ac.fatureweb.jf.model.Historico;
import br.com.ac.fatureweb.jf.model.Leiturista;
import br.com.ac.fatureweb.jf.model.Mensagem;
import br.com.ac.fatureweb.jf.model.Ocorrencia;
import br.com.ac.fatureweb.jf.model.Reservatorio;
import br.com.ac.fatureweb.jf.model.Saldo;
import br.com.ac.fatureweb.jf.model.Servicos_cobrar;
import br.com.ac.fatureweb.jf.model.Tarifa;
import br.com.ac.fatureweb.jf.model.Tarifa_social;
import br.com.ac.fatureweb.model.Carga;
import br.com.ac.fatureweb.model.carga.AnaliseAgua;
import br.com.ac.fatureweb.model.carga.AvisoDebito;
import br.com.ac.fatureweb.model.carga.ConfiguracaoCalculo;
import br.com.ac.fatureweb.model.carga.ConfiguracaoSAAE;
import br.com.ac.fatureweb.model.carga.Debito;
import br.com.ac.fatureweb.model.carga.Economia;
import br.com.ac.fatureweb.model.carga.Faixa;
import br.com.ac.fatureweb.model.carga.Imovel;
import br.com.ac.fatureweb.model.carga.LancamentoFuturo;
import br.com.ac.fatureweb.model.carga.LeituristaSaae;
import br.com.ac.fatureweb.model.carga.SaldoDebitoCredito;
import br.com.ac.fatureweb.model.carga.TarifaSocial;
import br.com.ac.fatureweb.utilitary.Criptografia;
import br.com.ac.fatureweb.utilitary.Util;

@Local
@Named
@Stateless
public class NgcImportacaoBean {

	@PersistenceContext
	private EntityManager entityManager;

	/**
	 * 
	 * @param configCalculoSaae
	 * @param configuracaoSaae
	 * @param lstAvisoDebito
	 * @param lstDebito
	 * @param lstEconomia
	 * @param lstFicha
	 * @param lstHistorico
	 * @param lstLeiturista
	 * @param lstMensagem
	 * @param lstOcorrencia
	 * @param lstReservatorio
	 * @param lstSaldoDebitoCredito
	 * @param lstServicosCobrar
	 * @param lstTarifaSocial
	 * @param lstTarifa
	 * @return
	 */
	public Carga importar(Calculo configCalculoSaae,
			Configuracao configuracaoSaae, List<Aviso_Debito> lstAvisoDebito,
			List<Debitos> lstDebito, List<Economias> lstEconomia,
			List<Ficha> lstFicha, List<Historico> lstHistorico,
			List<Leiturista> lstLeiturista, List<Mensagem> lstMensagem,
			List<Ocorrencia> lstOcorrencia, List<Reservatorio> lstReservatorio,
			List<Saldo> lstSaldoDebitoCredito,
			List<Servicos_cobrar> lstServicosCobrar,
			List<Tarifa_social> lstTarifaSocial, List<Tarifa> lstTarifa) {

		entityManager.setFlushMode(FlushModeType.COMMIT);

		Carga carga = new Carga();
		carga.setDataCarga(new Date());
		carga.setEnumStatusCarga(EnumStatusCarga.DISPONIVEL);
		carga.setIdentificador(Criptografia.executeMd5(configuracaoSaae
				.toString()));

		entityManager.persist(carga);

		importarConfigCalculoSaae(configCalculoSaae, carga);

		importarConfiguracaoSaae(configuracaoSaae, carga);

		importarOcorrencia(lstOcorrencia, carga);

		importarLeiturista(lstLeiturista, carga);

		importarTarifa(lstTarifa, carga);

		importarAnaliseAgua(lstReservatorio, carga);

		importarImovel(lstFicha, carga);

		importarEconomia(lstEconomia, carga);

		importarHistorico(lstHistorico, carga);

		importarLancamentoFuturo(lstServicosCobrar, carga);

		importarAvisoDebito(lstAvisoDebito, carga);

		importarDebito(lstDebito, carga);

		importarTarifaSocial(lstTarifaSocial, carga);

		importarSaldoDebitoOuCredito(lstSaldoDebitoCredito, carga);

		importarMensagem(lstMensagem, carga);

		Carga cargaM = entityManager.merge(carga);

		return cargaM;
	}

	private void importarMensagem(List<Mensagem> lstMensagem, Carga carga) {
		if (lstMensagem != null && !lstMensagem.isEmpty()) {

			for (Mensagem mensagem : lstMensagem) {

				br.com.ac.fatureweb.model.carga.Mensagem mensagemP = new br.com.ac.fatureweb.model.carga.Mensagem();

				mensagemP.setCarga(carga);

				mensagemP
						.setTipMensagem(Util.getInt(mensagem.getTipMensagem()));

				mensagemP.setCodigo(Util.getLong(mensagem.getCodigo()));

				mensagemP.setLinha1(mensagem.getLinha1());

				mensagemP.setLinha2(mensagem.getLinha2());

				mensagemP.setLinha3(mensagem.getLinha3());

				mensagemP.setLinha4(mensagem.getLinha4());

				mensagemP.setLinha5(mensagem.getLinha5());

				mensagemP.setLinha6(mensagem.getLinha6());

				mensagemP.setLinha7(mensagem.getLinha7());

				mensagemP.setLinha8(mensagem.getLinha8());

				entityManager.persist(mensagemP);
			}
		}
	}

	private void importarSaldoDebitoOuCredito(
			List<Saldo> lstSaldoDebitoCredito, Carga carga) {
		if (lstSaldoDebitoCredito != null && !lstSaldoDebitoCredito.isEmpty()) {

			for (Saldo saldo : lstSaldoDebitoCredito) {

				SaldoDebitoCredito debitoCredito = new SaldoDebitoCredito();

				debitoCredito.setCarga(carga);

				debitoCredito.setInscricao(saldo.getInscricao());

				if (saldo.getTipo() != null) {
					debitoCredito.setTipo(EnumTypeSaldo.valueOf(saldo.getTipo()
							.charAt(0)));
				}

				debitoCredito.setConsumo(saldo.getConsumo());

				entityManager.persist(debitoCredito);
			}
		}
	}

	/**
	 * Importar os imóveis que tem tarifa social.
	 * 
	 * @param lstTarifaSocial
	 * @param carga
	 */
	private void importarTarifaSocial(List<Tarifa_social> lstTarifaSocial,
			Carga carga) {
		if (lstTarifaSocial != null && !lstTarifaSocial.isEmpty()) {

			for (Tarifa_social tarifa_Social : lstTarifaSocial) {

				TarifaSocial tarifaSocialP = new TarifaSocial();

				tarifaSocialP.setCarga(carga);

				tarifaSocialP.setInscricao(tarifa_Social.getInscricao());

				tarifaSocialP
						.setConsumoMinimo(tarifa_Social.getConsumoMinimo());

				tarifaSocialP.setCodigoTarifaSocial(tarifa_Social
						.getCodigoTarifaSocial());

				entityManager.persist(tarifaSocialP);
			}
		}
	}

	/**
	 * Importar débitos.
	 * 
	 * @param lstDebito
	 * @param carga
	 */
	private void importarDebito(List<Debitos> lstDebito, Carga carga) {
		if (lstDebito != null && !lstDebito.isEmpty()) {

			for (Debitos debitos : lstDebito) {

				Debito debitoP = new Debito();

				debitoP.setCarga(carga);

				debitoP.setInscricao(debitos.getInscricao());

				debitoP.setNumeroFatura(debitos.getNumeroFatura());

				debitoP.setCompetencia(debitos.getCompetencia());

				debitoP.setVencimento(debitos.getVencimento());

				debitoP.setValor(debitos.getValor());

				entityManager.persist(debitoP);
			}
		}
	}

	/**
	 * Importar avisos de débitos.
	 * 
	 * @param lstAvisoDebito
	 * @param carga
	 */
	private void importarAvisoDebito(List<Aviso_Debito> lstAvisoDebito,
			Carga carga) {
		if (lstAvisoDebito != null && !lstAvisoDebito.isEmpty()) {

			for (Aviso_Debito avisoDebito : lstAvisoDebito) {

				AvisoDebito avisoDebitoP = new AvisoDebito();

				avisoDebitoP.setCarga(carga);

				avisoDebitoP.setInscricao(avisoDebito.getInscricao());

				avisoDebitoP.setNumero(avisoDebito.getNumero());

				avisoDebitoP.setVencimento(Util.getDate(avisoDebito
						.getVencimento()));

				avisoDebitoP.setCodigoBarras(avisoDebito.getCodigoBarras());

				avisoDebitoP.setValor(avisoDebito.getValor());

				entityManager.persist(avisoDebitoP);
			}
		}
	}

	/**
	 * Importar os lançamentos futuros(Serviços a cobrar).
	 * 
	 * @param lstServicosCobrar
	 * @param carga
	 */
	private void importarLancamentoFuturo(
			List<Servicos_cobrar> lstServicosCobrar, Carga carga) {
		if (lstServicosCobrar != null && !lstServicosCobrar.isEmpty()) {

			for (Servicos_cobrar servicos_cobrar : lstServicosCobrar) {

				LancamentoFuturo lancamento = new LancamentoFuturo();

				lancamento.setCarga(carga);

				lancamento.setInscricao(servicos_cobrar.getInscricao());

				lancamento.setCodServico(servicos_cobrar.getCodServico());

				lancamento.setDescricao(servicos_cobrar.getDescricao());

				lancamento.setValor(servicos_cobrar.getValor());

				lancamento.setParcela(servicos_cobrar.getParcela());

				entityManager.persist(lancamento);
			}

			carga.setQtdLancamentoFuturo(lstServicosCobrar.size());
		}
	}

	/**
	 * Importar os históricos de leitura dos imóveis.
	 * 
	 * @param lstHistorico
	 * @param carga
	 */
	private void importarHistorico(List<Historico> lstHistorico, Carga carga) {
		if (lstHistorico != null && !lstHistorico.isEmpty()) {

			for (Historico historico : lstHistorico) {

				br.com.ac.fatureweb.model.carga.Historico historicoP = new br.com.ac.fatureweb.model.carga.Historico();

				historicoP.setCarga(carga);

				historicoP.setInscricao(historico.getInscricao());

				historicoP.setMes1(historico.getMes1());

				historicoP.setAno1(historico.getAno1());

				historicoP.setUltimoConsumo1(historico.getUltimoConsumo1());

				historicoP.setUltimaOcorrencia1(historico
						.getUltimaOcorrencia1());

				historicoP.setDiasConsumo1(historico.getDiasConsumo1());

				historicoP.setMes2(historico.getMes2());

				historicoP.setAno2(historico.getAno2());

				historicoP.setUltimoConsumo2(historico.getUltimoConsumo2());

				historicoP.setUltimaOcorrencia2(historico
						.getUltimaOcorrencia2());

				historicoP.setMes3(historico.getMes3());

				historicoP.setAno3(historico.getAno3());

				historicoP.setUltimoConsumo3(historico.getUltimoConsumo3());

				historicoP.setDiasConsumo2(historico.getDiasConsumo2());

				historicoP.setUltimaOcorrencia3(historico
						.getUltimaOcorrencia3());

				historicoP.setMes4(historico.getMes4());

				historicoP.setAno4(historico.getAno4());

				historicoP.setUltimoConsumo4(historico.getUltimoConsumo4());

				historicoP.setDiasConsumo3(historico.getDiasConsumo3());

				historicoP.setUltimaOcorrencia4(historico
						.getUltimaOcorrencia4());

				historicoP.setDiasConsumo4(historico.getDiasConsumo4());

				historicoP.setMes5(historico.getMes5());

				historicoP.setAno5(historico.getAno5());

				historicoP.setUltimoConsumo5(historico.getUltimoConsumo5());

				historicoP.setUltimaOcorrencia5(historico
						.getUltimaOcorrencia5());

				historicoP.setDiasConsumo5(historico.getDiasConsumo5());

				historicoP.setMes6(historico.getMes6());

				historicoP.setAno6(historico.getAno6());

				historicoP.setUltimoConsumo6(historico.getUltimoConsumo6());

				historicoP.setUltimaOcorrencia6(historico
						.getUltimaOcorrencia6());

				entityManager.persist(historicoP);
			}
		}
	}

	/**
	 * Importar as economias do imóveis.
	 * 
	 * @param lstEconomia
	 * @param carga
	 */
	private void importarEconomia(List<Economias> lstEconomia, Carga carga) {
		if (lstEconomia != null && !lstEconomia.isEmpty()) {

			for (Economias economias : lstEconomia) {
				Economia economiaP = new Economia();

				economiaP.setCarga(carga);

				economiaP.setInscricao(economias.getInscricao());

				economiaP.setCodTarifa(economias.getCodTarifa());

				economiaP.setQtdEconomias(economias.getQtdEconomias());

				entityManager.persist(economiaP);
			}
		}
	}

	/**
	 * Importar os imóveis para leitura.
	 * 
	 * @param lstFicha
	 * @param carga
	 */
	private void importarImovel(List<Ficha> lstFicha, Carga carga) {
		if (lstFicha != null && !lstFicha.isEmpty()) {

			for (Ficha ficha : lstFicha) {
				Imovel imovel = new Imovel();

				imovel.setCarga(carga);

				imovel.setInscricao(ficha.getInscricao());

				imovel.setMes(ficha.getMes());

				imovel.setAno(ficha.getAno());

				imovel.setCodLocalidade(ficha.getCodLocalidade());

				imovel.setCodDistrito(ficha.getCodDistrito());

				imovel.setCodSetor(ficha.getCodSetor());

				imovel.setOrdemRoteiro(Util.getIntComPonto(ficha
						.getOrdemRoteiro()));

				imovel.setNomeResponsavel(ficha.getNomeResponsavel());

				imovel.setCpfcnpj(ficha.getCpfcnpj());

				imovel.setRua(ficha.getRua());

				imovel.setNumero(ficha.getNumero());

				imovel.setComplemento(ficha.getComplemento());

				imovel.setBairro(ficha.getBairro());

				imovel.setCidade(ficha.getCidade());

				imovel.setUf(ficha.getUf());

				imovel.setCep(ficha.getCep());

				imovel.setCategoria(ficha.getCategoria());

				imovel.setClasse(ficha.getClasse());

				imovel.setTarifa(Util.getLong(ficha.getTarifa()));

				imovel.setTemHidrometro(Util.getBoolean(ficha
						.getTemHidrometro()));

				imovel.setNumeroHidrometro(ficha.getNumeroHidrometro());

				imovel.setDataInstalacaoHidrometro(Util.getDateComBarra(ficha
						.getDataInstalacaoHidrometro()));

				imovel.setConsumoMedio(Util.getLong(ficha.getConsumoMedio()));

				imovel.setLeituraAnterior(Util.getLong(ficha
						.getLeituraAnterior()));

				imovel.setOcorrenciaAnterior(Util.getLong(ficha
						.getOcorrenciaAnterior()));

				imovel.setDataLeituraAnterior(Util.getDateComBarra(ficha
						.getDataLeituraAnterior()));

				imovel.setCodReservatorio(Util.getLong(ficha
						.getCodReservatorio()));

				imovel.setFlgFaturaAgua(Util.getBoolean(ficha
						.getFlgFaturaAgua()));

				imovel.setFlgFaturaEsgoto(Util.getBoolean(ficha
						.getFlgFaturaEsgoto()));

				imovel.setPercentualEsgoto(Util.getDouble(ficha
						.getPercentualEsgoto()));

				imovel.setIsentoConshid(Util.getBoolean(ficha
						.getIsentoConshid()));

				imovel.setIsentoTaxa1(Util.getBoolean(ficha.getIsentoTaxa1()));

				imovel.setIsentoTaxa2(Util.getBoolean(ficha.getIsentoTaxa2()));

				imovel.setFlgEmitirConta(Util.getBoolean(ficha
						.getFlgEmitirConta()));

				imovel.setSituacao(EnumSituacaoLigacao.valueOf(Util
						.getInt(ficha.getSituacao())));

				imovel.setAgrupadora(Util.getBoolean(ficha.getAgrupadora()));

				imovel.setFlgDebitoEmConta(Util.getBoolean(ficha
						.getFlgDebitoEmConta()));

				imovel.setMesesDebito(ficha.getMesesDebito());

				imovel.setDataProximaLeitura(Util.getDateComBarra(ficha
						.getDataProximaLeitura()));

				imovel.setDataVencimento(Util.getDateComBarra(ficha
						.getDataVencimento()));

				imovel.setNumeroFatura(ficha.getNumeroFatura());

				imovel.setCodigoBarras(ficha.getCodigoBarras());

				entityManager.persist(imovel);
			}

			carga.setQtdImovel(lstFicha.size());

			String mesS = lstFicha.iterator().next().getMes().toString();
			if (lstFicha.iterator().next().getMes() < 10) {
				mesS = "0" + lstFicha.iterator().next().getMes();
			}

			carga.setCodSetor(lstFicha.iterator().next().getCodSetor());

			carga.setCompetencia(new Long(""
					+ lstFicha.iterator().next().getAno() + mesS));
		}
	}

	/**
	 * Importar os números das amostras de água(Análise de Água).
	 * 
	 * @param lstReservatorio
	 * @param carga
	 */
	private void importarAnaliseAgua(List<Reservatorio> lstReservatorio,
			Carga carga) {
		if (lstReservatorio != null && !lstReservatorio.isEmpty()) {
			for (Reservatorio reservatorio : lstReservatorio) {
				AnaliseAgua analiseAgua = new AnaliseAgua();

				analiseAgua.setCarga(carga);

				analiseAgua.setCodigo(reservatorio.getCodigo());

				analiseAgua.setDescricao(reservatorio.getDescricao());

				analiseAgua.setDataColetaInicio(Util
						.getDateComBarra(reservatorio.getDataColetaInicio()));

				analiseAgua.setDataColetaFinal(Util
						.getDateComBarra(reservatorio.getDataColetaFinal()));

				analiseAgua.setMes(reservatorio.getMes());

				analiseAgua.setAno(reservatorio.getAno());

				analiseAgua.setTexto1(reservatorio.getTexto1());

				analiseAgua.setTexto2(reservatorio.getTexto2());

				analiseAgua.setTexto3(reservatorio.getTexto3());

				analiseAgua.setTexto4(reservatorio.getTexto4());

				analiseAgua.setTexto5(reservatorio.getTexto5());

				analiseAgua.setTexto6(reservatorio.getTexto6());

				analiseAgua
						.setColeta1(Util.getDouble(reservatorio.getColeta1()));

				analiseAgua
						.setColeta2(Util.getDouble(reservatorio.getColeta2()));

				analiseAgua
						.setColeta3(Util.getDouble(reservatorio.getColeta3()));

				analiseAgua
						.setColeta4(Util.getDouble(reservatorio.getColeta4()));

				analiseAgua
						.setColeta5(Util.getDouble(reservatorio.getColeta5()));

				analiseAgua
						.setColeta6(Util.getDouble(reservatorio.getColeta6()));

				analiseAgua.setQtd1(reservatorio.getQtd1());

				analiseAgua.setQtd2(reservatorio.getQtd2());

				analiseAgua.setQtd3(reservatorio.getQtd3());

				analiseAgua.setQtd4(reservatorio.getQtd4());

				analiseAgua.setQtd5(reservatorio.getQtd5());

				analiseAgua.setQtd6(reservatorio.getQtd6());

				entityManager.persist(analiseAgua);
			}
		}
	}

	/**
	 * Realizar a importação das tarifas e suas faixas.
	 * 
	 * @param lstTarifa
	 * @param carga
	 */
	private void importarTarifa(List<Tarifa> lstTarifa, Carga carga) {
		if (lstTarifa != null && !lstTarifa.isEmpty()) {

			for (Tarifa tarifaTemp : lstTarifa) {

				br.com.ac.fatureweb.model.carga.Tarifa tarifaP = new br.com.ac.fatureweb.model.carga.Tarifa();

				tarifaP.setCarga(carga);

				tarifaP.setCodigo(tarifaTemp.getCodigo());

				tarifaP.setAno(tarifaTemp.getMes());

				tarifaP.setMes(tarifaTemp.getAno());

				tarifaP.setValorFixo(tarifaTemp.getValorFixo());

				tarifaP.setValorSemhidro(tarifaTemp.getValorSemhidro());

				tarifaP.setSigla(tarifaTemp.getSigla());

				if (tarifaTemp.getLstFaixa() != null
						&& !tarifaTemp.getLstFaixa().isEmpty()) {

					List<Faixa> lstFaixaP = new ArrayList<Faixa>();

					for (br.com.ac.fatureweb.jf.model.Faixa faixaTemp : tarifaTemp
							.getLstFaixa()) {

						Faixa faixaP = new Faixa();

						faixaP.setTarifa(tarifaP);

						faixaP.setCarga(carga);

						faixaP.setInicio(faixaTemp.getFaixaInicio());

						faixaP.setFim(faixaTemp.getFaixaFinal());

						faixaP.setValor(faixaTemp.getValor());

						faixaP.setCobrancaMaxima(Util.getBoolean(faixaTemp
								.getCobrarFaixaFinal()));

						lstFaixaP.add(faixaP);
					}

					tarifaP.setLstFaixa(lstFaixaP);
				}
				entityManager.persist(tarifaP);
			}
		}
	}

	/**
	 * Importar leiturista cadastrado no saae.
	 * 
	 * @param lstLeiturista
	 * @param carga
	 */
	private void importarLeiturista(List<Leiturista> lstLeiturista, Carga carga) {
		if (lstLeiturista != null && !lstLeiturista.isEmpty()) {

			for (Leiturista leituristaTemp : lstLeiturista) {

				LeituristaSaae leituristaSaae = new LeituristaSaae();

				leituristaSaae.setCarga(carga);

				leituristaSaae.setCodigo(leituristaTemp.getCodigo());

				leituristaSaae.setNome(leituristaTemp.getNome());

				entityManager.persist(leituristaSaae);
			}
		}
	}

	/**
	 * Importar as ocorrências de leituras.
	 * 
	 * @param lstOcorrencia
	 * @param carga
	 */
	private void importarOcorrencia(List<Ocorrencia> lstOcorrencia, Carga carga) {

		if (lstOcorrencia != null && !lstOcorrencia.isEmpty()) {

			for (Ocorrencia ocorrenciaTemp : lstOcorrencia) {

				br.com.ac.fatureweb.model.carga.Ocorrencia ocorrenciaP = new br.com.ac.fatureweb.model.carga.Ocorrencia();

				ocorrenciaP.setCarga(carga);

				ocorrenciaP.setCodigo(ocorrenciaTemp.getCodigo());

				ocorrenciaP.setDescricao(ocorrenciaTemp.getDescricao());

				ocorrenciaP.setFlgOcorrencia(Util.getBoolean(ocorrenciaTemp
						.getFlgOcorrencia()));

				if (ocorrenciaTemp.getFlgTipoCobranca() != null
						&& ocorrenciaTemp.getFlgTipoCobranca().length() > 0) {
					ocorrenciaP.setFlgTipoCobranca(EnumTypeCobranca
							.valueOf(Util.getInt(ocorrenciaTemp
									.getFlgTipoCobranca())));
				}

				ocorrenciaP.setFlgEmitirConta(Util.getBoolean(ocorrenciaTemp
						.getEmitirConta()));

				entityManager.persist(ocorrenciaP);
			}
		}
	}

	/**
	 * Importar as configurações do SAAE.
	 * 
	 * @param configuracaoSaae
	 * @param carga
	 */
	private void importarConfiguracaoSaae(Configuracao configuracaoSaae,
			Carga carga) {
		if (configuracaoSaae != null) {

			ConfiguracaoSAAE configuracaoSaaePersist = new ConfiguracaoSAAE();

			configuracaoSaaePersist.setCarga(carga);

			configuracaoSaaePersist.setCidCliente(configuracaoSaae
					.getCidCliente());

			configuracaoSaaePersist.setUnfCliente(configuracaoSaae
					.getUnfCliente());

			configuracaoSaaePersist.setSiglaCliente(configuracaoSaae
					.getSiglaCliente());

			configuracaoSaaePersist.setDataRemessa(Util
					.getDate(configuracaoSaae.getDataRemessa()));

			configuracaoSaaePersist.setHoraRemessa(Util
					.getTime(configuracaoSaae.getHoraRemessa()));

			configuracaoSaaePersist.setExibirLeituraAnterior(Util
					.getBoolean(configuracaoSaae.getExibirLeituraAnterior()));

			configuracaoSaaePersist
					.setExibirOcorrenciaAnterior(Util
							.getBoolean(configuracaoSaae
									.getExibirOcorrenciaAnterior()));

			Integer fatConsZerado = Util.getInt(configuracaoSaae
					.getFatConszerado());

			if (fatConsZerado != null) {
				configuracaoSaaePersist.setFatConszerado(EnumConsumoZerado
						.valueOf(fatConsZerado));
			}

			configuracaoSaaePersist
					.setPercentualVariacaoLeitura(Util
							.getDouble(configuracaoSaae
									.getPercentualVariacaoLeitura()));

			configuracaoSaaePersist.setOcultaCsmsemhidro(Util
					.getBoolean(configuracaoSaae.getOcultaCsmsemhidro()));

			entityManager.persist(configuracaoSaaePersist);
		}
	}

	/**
	 * Importar parâmetros para cálculo das contas do SAAE.
	 * 
	 * @param configCalculoSaae
	 * @param carga
	 */
	private void importarConfigCalculoSaae(Calculo configCalculoSaae,
			Carga carga) {
		if (configCalculoSaae != null) {
			ConfiguracaoCalculo configuracaoCalculoSaae = new ConfiguracaoCalculo();

			configuracaoCalculoSaae.setCarga(carga);

			configuracaoCalculoSaae
					.setPctMulta(configCalculoSaae.getPctMulta());

			configuracaoCalculoSaae
					.setPctJuros(configCalculoSaae.getPctJuros());

			configuracaoCalculoSaae.setValMinimo(configCalculoSaae
					.getValMinimo());

			configuracaoCalculoSaae.setFlgConshidro(configCalculoSaae
					.getFlgConshidro());

			configuracaoCalculoSaae.setCsmConshidro(configCalculoSaae
					.getCsmConshidro());

			configuracaoCalculoSaae.setDesConshidro(configCalculoSaae
					.getDesConshidro());

			configuracaoCalculoSaae.setValConshidro(configCalculoSaae
					.getValConshidro());

			configuracaoCalculoSaae
					.setFlgTaxa1(configCalculoSaae.getFlgTaxa1());

			configuracaoCalculoSaae
					.setCsmTaxa1(configCalculoSaae.getCsmTaxa1());

			configuracaoCalculoSaae
					.setDesTaxa1(configCalculoSaae.getDesTaxa1());

			configuracaoCalculoSaae
					.setValTaxa1(configCalculoSaae.getValTaxa1());

			configuracaoCalculoSaae
					.setFlgTaxa2(configCalculoSaae.getFlgTaxa2());

			configuracaoCalculoSaae
					.setCsmTaxa2(configCalculoSaae.getCsmTaxa2());

			configuracaoCalculoSaae
					.setDesTaxa2(configCalculoSaae.getDesTaxa2());

			configuracaoCalculoSaae
					.setValTaxa2(configCalculoSaae.getValTaxa2());

			entityManager.persist(configuracaoCalculoSaae);
		}
	}

	@SuppressWarnings("unchecked")
	public List<AnaliseAguaVO> findAnaliseAgua(Long seqRoteiro) {

		Query query = entityManager.createQuery("SELECT ana "
				+ " FROM Roteiro rot INNER JOIN rot.carga car1, "
				+ " AnaliseAgua ana INNER JOIN ana.carga car2 "
				+ " WHERE car1.id = car2.id AND rot.id =:id");

		query.setParameter("id", seqRoteiro);

		List<AnaliseAgua> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<AnaliseAguaVO> lstRetorno = new ArrayList<AnaliseAguaVO>();

			Calendar calendar = Calendar.getInstance(new Locale("pt", "BR"));

			for (AnaliseAgua analiseAgua : resultList) {

				AnaliseAguaVO analiseVo = new AnaliseAguaVO();

				analiseVo.setId(analiseAgua.getId());
				analiseVo.setCodigo(analiseAgua.getCodigo());
				analiseVo.setDescricao(analiseAgua.getDescricao());

				if (analiseAgua.getDataColetaInicio() != null) {
					calendar.setTime(analiseAgua.getDataColetaInicio());
					analiseVo.setDataColetaInicio(calendar.getTimeInMillis());
				}

				if (analiseAgua.getDataColetaFinal() != null) {
					calendar.setTime(analiseAgua.getDataColetaFinal());
					analiseVo.setDataColetaFinal(calendar.getTimeInMillis());
				}

				analiseVo.setMes(analiseAgua.getMes());
				analiseVo.setAno(analiseAgua.getAno());
				analiseVo.setTexto1(analiseAgua.getTexto1());
				analiseVo.setTexto2(analiseAgua.getTexto2());
				analiseVo.setTexto3(analiseAgua.getTexto3());
				analiseVo.setTexto4(analiseAgua.getTexto4());
				analiseVo.setTexto5(analiseAgua.getTexto5());
				analiseVo.setTexto6(analiseAgua.getTexto6());
				analiseVo.setColeta1(analiseAgua.getColeta1());
				analiseVo.setColeta2(analiseAgua.getColeta2());
				analiseVo.setColeta3(analiseAgua.getColeta3());
				analiseVo.setColeta4(analiseAgua.getColeta4());
				analiseVo.setColeta5(analiseAgua.getColeta5());
				analiseVo.setColeta6(analiseAgua.getColeta6());
				analiseVo.setQtd1(analiseAgua.getQtd1());
				analiseVo.setQtd2(analiseAgua.getQtd2());
				analiseVo.setQtd3(analiseAgua.getQtd3());
				analiseVo.setQtd4(analiseAgua.getQtd4());
				analiseVo.setQtd5(analiseAgua.getQtd5());
				analiseVo.setQtd6(analiseAgua.getQtd6());

				lstRetorno.add(analiseVo);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<AvisoDebitoVO> findAvisoDebito(Long seqRoteiro) {
		Query query = entityManager
				.createQuery("SELECT avs FROM AvisoDebito avs "
						+ " INNER JOIN avs.carga car1 "
						+ " WHERE avs.inscricao IN ( SELECT imo.inscricao "
						+ " FROM ItemRoteiro it "
						+ " INNER JOIN it.imovel imo "
						+ " INNER JOIN it.roteiro rot "
						+ " INNER JOIN rot.carga car2 "
						+ " WHERE car1.id = car2.id AND rot.id =:id )");

		query.setParameter("id", seqRoteiro);

		List<AvisoDebito> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<AvisoDebitoVO> lstRetorno = new ArrayList<AvisoDebitoVO>();

			for (AvisoDebito avisoDebito : resultList) {
				AvisoDebitoVO avisoDebitoVO = new AvisoDebitoVO();

				avisoDebitoVO.setId(avisoDebito.getId());
				avisoDebitoVO.setInscricao(avisoDebito.getInscricao());
				avisoDebitoVO.setNumero(avisoDebito.getNumero());
				avisoDebitoVO.setVencimento(avisoDebito.getVencimento());
				avisoDebitoVO.setCodigoBarras(avisoDebito.getCodigoBarras());
				avisoDebitoVO.setValor(avisoDebito.getValor());

				lstRetorno.add(avisoDebitoVO);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public ConfiguracaoCalculoVO findConfiguracaoCalculo(Long seqRoteiro) {

		Query query = entityManager.createQuery("SELECT cal "
				+ " FROM Roteiro rot INNER JOIN rot.carga car1, "
				+ " ConfiguracaoCalculo cal INNER JOIN cal.carga car2 "
				+ " WHERE car1.id = car2.id AND rot.id =:id");

		query.setParameter("id", seqRoteiro);

		List<ConfiguracaoCalculo> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			ConfiguracaoCalculo calculo = resultList.iterator().next();

			ConfiguracaoCalculoVO calculoVO = new ConfiguracaoCalculoVO();

			calculoVO.setId(calculo.getId());
			calculoVO.setPctMulta(calculo.getPctMulta());
			calculoVO.setPctJuros(calculo.getPctJuros());
			calculoVO.setValMinimo(calculo.getValMinimo());
			calculoVO.setFlgConshidro(calculo.getFlgConshidro());
			calculoVO.setCsmConshidro(calculo.getCsmConshidro());
			calculoVO.setDesConshidro(calculo.getDesConshidro());
			calculoVO.setValConshidro(calculo.getValConshidro());
			calculoVO.setFlgTaxa1(calculo.getFlgTaxa1());
			calculoVO.setCsmTaxa1(calculo.getCsmTaxa1());
			calculoVO.setDesTaxa1(calculo.getDesTaxa1());
			calculoVO.setValTaxa1(calculo.getValTaxa1());
			calculoVO.setFlgTaxa2(calculo.getFlgTaxa2());
			calculoVO.setCsmTaxa2(calculo.getCsmTaxa2());
			calculoVO.setDesTaxa2(calculo.getDesTaxa2());
			calculoVO.setValTaxa2(calculo.getValTaxa2());

			return calculoVO;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public ConfiguracaoSaaeVO findConfiguracaoSaae(Long seqRoteiro) {
		Query query = entityManager.createQuery("SELECT conf "
				+ " FROM Roteiro rot INNER JOIN rot.carga car1, "
				+ " ConfiguracaoSAAE conf INNER JOIN conf.carga car2 "
				+ " WHERE car1.id = car2.id AND rot.id =:id");

		query.setParameter("id", seqRoteiro);

		List<ConfiguracaoSAAE> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			ConfiguracaoSAAE configuracaoSAAE = resultList.iterator().next();

			ConfiguracaoSaaeVO configuracaoSaaeVO = new ConfiguracaoSaaeVO();

			configuracaoSaaeVO.setId(configuracaoSAAE.getId());

			configuracaoSaaeVO.setCidCliente(configuracaoSAAE.getCidCliente());

			configuracaoSaaeVO.setUnfCliente(configuracaoSAAE.getUnfCliente());

			configuracaoSaaeVO.setSiglaCliente(configuracaoSAAE
					.getSiglaCliente());

			configuracaoSaaeVO
					.setDataRemessa(configuracaoSAAE.getDataRemessa());

			configuracaoSaaeVO
					.setHoraRemessa(configuracaoSAAE.getHoraRemessa());

			configuracaoSaaeVO.setExibirLeituraAnterior(configuracaoSAAE
					.isExibirLeituraAnterior());

			configuracaoSaaeVO.setExibirOcorrenciaAnterior(configuracaoSAAE
					.isExibirOcorrenciaAnterior());

			configuracaoSaaeVO.setFatConszerado(configuracaoSAAE
					.getFatConszerado().ordinal());

			configuracaoSaaeVO.setPercentualVariacaoLeitura(configuracaoSAAE
					.getPercentualVariacaoLeitura());

			configuracaoSaaeVO.setOcultaCsmsemhidro(configuracaoSAAE
					.isOcultaCsmsemhidro());

			return configuracaoSaaeVO;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<DebitoVO> findDebito(Long seqRoteiro) {
		Query query = entityManager.createQuery("SELECT avs FROM Debito avs "
				+ " INNER JOIN avs.carga car1 "
				+ " WHERE avs.inscricao IN ( SELECT imo.inscricao "
				+ " FROM ItemRoteiro it  INNER JOIN it.imovel imo "
				+ " INNER JOIN it.roteiro rot INNER JOIN rot.carga car2 "
				+ " WHERE car1.id = car2.id AND rot.id =:id )");

		query.setParameter("id", seqRoteiro);

		List<Debito> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<DebitoVO> lstRetorno = new ArrayList<DebitoVO>();

			for (Debito debito : resultList) {
				DebitoVO debitoVO = new DebitoVO();

				debitoVO.setId(debito.getId());
				debitoVO.setInscricao(debito.getInscricao());
				debitoVO.setNumeroFatura(debito.getNumeroFatura());
				debitoVO.setCompetencia(debito.getCompetencia());
				debitoVO.setVencimento(debito.getVencimento());
				debitoVO.setValor(debito.getValor());

				lstRetorno.add(debitoVO);
			}
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<EconomiaVO> findEconomia(Long seqRoteiro) {
		Query query = entityManager.createQuery("SELECT eco FROM Economia eco "
				+ " INNER JOIN eco.carga car1 "
				+ " WHERE eco.inscricao IN ( SELECT imo.inscricao "
				+ " FROM ItemRoteiro it  INNER JOIN it.imovel imo "
				+ " INNER JOIN it.roteiro rot INNER JOIN rot.carga car2 "
				+ " WHERE car1.id = car2.id AND rot.id =:id )");

		query.setParameter("id", seqRoteiro);

		List<Economia> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<EconomiaVO> lstRetorno = new ArrayList<EconomiaVO>();

			for (Economia economia : resultList) {

				EconomiaVO economiaVO = new EconomiaVO();

				economiaVO.setId(economia.getId());
				economiaVO.setInscricao(economia.getInscricao());
				economiaVO.setCodTarifa(economia.getCodTarifa());
				economiaVO.setQtdEconomias(economia.getQtdEconomias());

				lstRetorno.add(economiaVO);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<HistoricoVO> findHistorico(Long seqRoteiro) {
		Query query = entityManager
				.createQuery("SELECT avs FROM Historico avs "
						+ " INNER JOIN avs.carga car1 "
						+ " WHERE avs.inscricao IN ( SELECT imo.inscricao "
						+ " FROM ItemRoteiro it "
						+ " INNER JOIN it.imovel imo "
						+ " INNER JOIN it.roteiro rot "
						+ " INNER JOIN rot.carga car2 "
						+ " WHERE car1.id = car2.id AND rot.id =:id )");

		query.setParameter("id", seqRoteiro);

		List<br.com.ac.fatureweb.model.carga.Historico> resultList = query
				.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<HistoricoVO> lstRetorno = new ArrayList<HistoricoVO>();

			for (br.com.ac.fatureweb.model.carga.Historico historico : resultList) {

				HistoricoVO historicoVO = new HistoricoVO();

				historicoVO.setId(historico.getId());
				historicoVO.setInscricao(historico.getInscricao());

				historicoVO.setDiasConsumo1(historico.getDiasConsumo1());
				historicoVO.setMes1(historico.getMes1());
				historicoVO.setAno1(historico.getAno1());
				historicoVO.setUltimoConsumo1(historico.getUltimoConsumo1());
				historicoVO.setUltimaOcorrencia1(historico
						.getUltimaOcorrencia1());

				historicoVO.setDiasConsumo2(historico.getDiasConsumo2());
				historicoVO.setMes2(historico.getMes2());
				historicoVO.setAno2(historico.getAno2());
				historicoVO.setUltimoConsumo2(historico.getUltimoConsumo2());
				historicoVO.setUltimaOcorrencia2(historico
						.getUltimaOcorrencia2());

				historicoVO.setDiasConsumo3(historico.getDiasConsumo3());
				historicoVO.setMes3(historico.getMes3());
				historicoVO.setAno3(historico.getAno3());
				historicoVO.setUltimoConsumo3(historico.getUltimoConsumo3());
				historicoVO.setUltimaOcorrencia3(historico
						.getUltimaOcorrencia3());

				historicoVO.setDiasConsumo4(historico.getDiasConsumo4());
				historicoVO.setMes4(historico.getMes4());
				historicoVO.setAno4(historico.getAno4());
				historicoVO.setUltimoConsumo4(historico.getUltimoConsumo4());
				historicoVO.setUltimaOcorrencia4(historico
						.getUltimaOcorrencia4());

				historicoVO.setDiasConsumo5(historico.getDiasConsumo5());
				historicoVO.setMes5(historico.getMes5());
				historicoVO.setAno5(historico.getAno5());
				historicoVO.setUltimoConsumo5(historico.getUltimoConsumo5());
				historicoVO.setUltimaOcorrencia5(historico
						.getUltimaOcorrencia5());

				historicoVO.setDiasConsumo6(historico.getDiasConsumo6());
				historicoVO.setMes6(historico.getMes6());
				historicoVO.setAno6(historico.getAno6());
				historicoVO.setUltimoConsumo6(historico.getUltimoConsumo6());
				historicoVO.setUltimaOcorrencia6(historico
						.getUltimaOcorrencia6());

				lstRetorno.add(historicoVO);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<ImovelVO> findImovel(Long seqRoteiro) {
		Query query = entityManager
				.createQuery("SELECT NEW Imovel(imo, ite.ordem, car.id) "
						+ " FROM ItemRoteiro ite INNER JOIN ite.imovel imo "
						+ " INNER JOIN imo.carga car "
						+ " INNER JOIN ite.roteiro rot WHERE rot.id =:id");

		query.setParameter("id", seqRoteiro);

		List<Imovel> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<ImovelVO> lstRetorno = new ArrayList<ImovelVO>();

			for (Imovel imovel : resultList) {

				ImovelVO imovelVO = new ImovelVO();

				imovelVO.setId(imovel.getId());
				imovelVO.setIdCarga(imovel.getCarga().getId());
				imovelVO.setInscricao(imovel.getInscricao());
				imovelVO.setMes(imovel.getMes());
				imovelVO.setAno(imovel.getAno());
				imovelVO.setCodLocalidade(imovel.getCodLocalidade());
				imovelVO.setCodDistrito(imovel.getCodDistrito());
				imovelVO.setCodSetor(imovel.getCodSetor());

				// Informação vem da item de roteiro pois pode ser
				// personalizado.
				imovelVO.setOrdemRoteiro(imovel.getOrdemRoteiro());

				imovelVO.setNomeResponsavel(imovel.getNomeResponsavel());
				imovelVO.setCpfcnpj(imovel.getCpfcnpj());
				imovelVO.setRua(imovel.getRua());
				imovelVO.setNumero(imovel.getNumero());
				imovelVO.setComplemento(imovel.getComplemento());
				imovelVO.setBairro(imovel.getBairro());
				imovelVO.setCidade(imovel.getCidade());
				imovelVO.setUf(imovel.getUf());
				imovelVO.setCep(imovel.getCep());
				imovelVO.setCategoria(imovel.getCategoria());
				imovelVO.setClasse(imovel.getClasse());
				imovelVO.setTarifa(imovel.getTarifa());
				imovelVO.setTemHidrometro(imovel.isTemHidrometro());
				imovelVO.setNumeroHidrometro(imovel.getNumeroHidrometro());

				Calendar calendar = Calendar
						.getInstance(new Locale("pt", "BR"));

				if (imovel.getDataInstalacaoHidrometro() != null) {
					calendar.setTime(imovel.getDataInstalacaoHidrometro());
					imovelVO.setDataInstalacaoHidrometro(calendar
							.getTimeInMillis());
				}

				imovelVO.setConsumoMedio(imovel.getConsumoMedio());
				imovelVO.setLeituraAnterior(imovel.getLeituraAnterior());
				imovelVO.setOcorrenciaAnterior(imovel.getOcorrenciaAnterior());

				if (imovel.getDataLeituraAnterior() != null) {
					calendar.setTime(imovel.getDataLeituraAnterior());
					imovelVO.setDataLeituraAnterior(calendar.getTimeInMillis());
				}

				imovelVO.setCodReservatorio(imovel.getCodReservatorio());
				imovelVO.setFlgFaturaAgua(imovel.isFlgFaturaAgua());
				imovelVO.setFlgFaturaEsgoto(imovel.isFlgFaturaEsgoto());
				imovelVO.setPercentualEsgoto(imovel.getPercentualEsgoto());
				imovelVO.setIsentoConshid(imovel.isIsentoConshid());
				imovelVO.setIsentoTaxa1(imovel.isIsentoTaxa1());
				imovelVO.setIsentoTaxa2(imovel.isIsentoTaxa2());
				imovelVO.setFlgEmitirConta(imovel.isFlgEmitirConta());

				if (imovel.getSituacao() != null) {
					imovelVO.setSituacao(imovel.getSituacao().ordinal());
				}

				imovelVO.setAgrupadora(imovel.isAgrupadora());
				imovelVO.setFlgDebitoEmConta(imovel.isFlgDebitoEmConta());
				imovelVO.setMesesDebito(imovel.getMesesDebito());

				if (imovel.getDataProximaLeitura() != null) {
					calendar.setTime(imovel.getDataProximaLeitura());
					imovelVO.setDataProximaLeitura(calendar.getTimeInMillis());
				}

				if (imovel.getDataVencimento() != null) {
					calendar.setTime(imovel.getDataVencimento());
					imovelVO.setDataVencimento(calendar.getTimeInMillis());
				}

				imovelVO.setNumeroFatura(imovel.getNumeroFatura());
				imovelVO.setCodigoBarras(imovel.getCodigoBarras());

				lstRetorno.add(imovelVO);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<LancamentoFuturoVO> findLancamentoFuturo(Long seqRoteiro) {
		Query query = entityManager
				.createQuery("SELECT avs FROM LancamentoFuturo avs "
						+ " INNER JOIN avs.carga car1 "
						+ " WHERE avs.inscricao IN ( SELECT imo.inscricao "
						+ " FROM ItemRoteiro it "
						+ " INNER JOIN it.imovel imo "
						+ " INNER JOIN it.roteiro rot "
						+ " INNER JOIN rot.carga car2 "
						+ " WHERE car1.id = car2.id AND rot.id =:id )");

		query.setParameter("id", seqRoteiro);

		List<LancamentoFuturo> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<LancamentoFuturoVO> lstRetorno = new ArrayList<LancamentoFuturoVO>();

			for (LancamentoFuturo lancamento : resultList) {

				LancamentoFuturoVO lancamentoVO = new LancamentoFuturoVO();

				lancamentoVO.setId(lancamento.getId());
				lancamentoVO.setInscricao(lancamento.getInscricao());
				lancamentoVO.setCodServico(lancamento.getCodServico());
				lancamentoVO.setDescricao(lancamento.getDescricao());
				lancamentoVO.setValor(lancamento.getValor());
				lancamentoVO.setParcela(lancamento.getParcela());

				lstRetorno.add(lancamentoVO);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<MensagemVO> findMensagem(Long seqRoteiro) {
		Query query = entityManager.createQuery("SELECT men "
				+ " FROM Roteiro rot INNER JOIN rot.carga car1, "
				+ " Mensagem men INNER JOIN men.carga car2 "
				+ " WHERE car1.id = car2.id AND rot.id =:id");

		query.setParameter("id", seqRoteiro);

		List<br.com.ac.fatureweb.model.carga.Mensagem> resultList = query
				.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<MensagemVO> lstMensagem = new ArrayList<MensagemVO>();

			for (br.com.ac.fatureweb.model.carga.Mensagem mensagem : resultList) {

				MensagemVO mensagemVO = new MensagemVO();

				mensagem.setId(mensagem.getId());
				mensagem.setTipMensagem(mensagem.getTipMensagem());
				mensagem.setCodigo(mensagem.getCodigo());
				mensagem.setLinha1(mensagem.getLinha1());
				mensagem.setLinha2(mensagem.getLinha2());
				mensagem.setLinha3(mensagem.getLinha3());
				mensagem.setLinha4(mensagem.getLinha4());
				mensagem.setLinha5(mensagem.getLinha5());
				mensagem.setLinha6(mensagem.getLinha6());
				mensagem.setLinha7(mensagem.getLinha7());
				mensagem.setLinha8(mensagem.getLinha8());

				lstMensagem.add(mensagemVO);
			}

			return lstMensagem;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<OcorrenciaVO> findOcorrencia(Long seqRoteiro) {
		Query query = entityManager.createQuery("SELECT oco "
				+ " FROM Roteiro rot INNER JOIN rot.carga car1, "
				+ " Ocorrencia oco INNER JOIN oco.carga car2 "
				+ " WHERE car1.id = car2.id AND rot.id =:id");

		query.setParameter("id", seqRoteiro);

		List<br.com.ac.fatureweb.model.carga.Ocorrencia> resultList = query
				.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<OcorrenciaVO> lstRetorno = new ArrayList<OcorrenciaVO>();

			for (br.com.ac.fatureweb.model.carga.Ocorrencia ocorrencia : resultList) {

				OcorrenciaVO ocorrenciaVO = new OcorrenciaVO();

				ocorrenciaVO.setId(ocorrencia.getId());
				ocorrenciaVO.setCodigo(ocorrencia.getCodigo());
				ocorrenciaVO.setDescricao(ocorrencia.getDescricao());
				ocorrenciaVO.setFlgOcorrencia(ocorrencia.isFlgOcorrencia());

				if (ocorrencia.getFlgTipoCobranca() != null) {
					ocorrenciaVO.setFlgTipoCobranca(ocorrencia
							.getFlgTipoCobranca().ordinal());
				}

				ocorrenciaVO.setFlgEmitirConta(ocorrencia.isFlgEmitirConta());

				lstRetorno.add(ocorrenciaVO);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<SaldoDebitoCreditoVO> findSaldoDebitoCredito(Long seqRoteiro) {
		Query query = entityManager
				.createQuery("SELECT avs FROM SaldoDebitoCredito avs "
						+ " INNER JOIN avs.carga car1 "
						+ " WHERE avs.inscricao IN ( SELECT imo.inscricao "
						+ " FROM ItemRoteiro it "
						+ " INNER JOIN it.imovel imo "
						+ " INNER JOIN it.roteiro rot "
						+ " INNER JOIN rot.carga car2 "
						+ " WHERE car1.id = car2.id AND rot.id =:id )");

		query.setParameter("id", seqRoteiro);

		List<SaldoDebitoCredito> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<SaldoDebitoCreditoVO> lstRetorno = new ArrayList<SaldoDebitoCreditoVO>();

			for (SaldoDebitoCredito saldoDebitoCredito : resultList) {

				SaldoDebitoCreditoVO debitoCreditoVO = new SaldoDebitoCreditoVO();

				debitoCreditoVO.setId(saldoDebitoCredito.getId());
				debitoCreditoVO.setInscricao(saldoDebitoCredito.getInscricao());

				debitoCreditoVO.setTipo(saldoDebitoCredito.getTipo().ordinal());

				debitoCreditoVO.setConsumo(saldoDebitoCredito.getConsumo());

				lstRetorno.add(debitoCreditoVO);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<TarifaSocialVO> findTarifaSocial(Long seqRoteiro) {
		Query query = entityManager
				.createQuery("SELECT avs FROM TarifaSocial avs "
						+ " INNER JOIN avs.carga car1 "
						+ " WHERE avs.inscricao IN ( SELECT imo.inscricao "
						+ " FROM ItemRoteiro it "
						+ " INNER JOIN it.imovel imo "
						+ " INNER JOIN it.roteiro rot "
						+ " INNER JOIN rot.carga car2 "
						+ " WHERE car1.id = car2.id AND rot.id =:id )");

		query.setParameter("id", seqRoteiro);

		List<TarifaSocial> resultList = query.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<TarifaSocialVO> lstRetorno = new ArrayList<TarifaSocialVO>();

			for (TarifaSocial tarifaSocial : resultList) {

				TarifaSocialVO tarifaSocialVO = new TarifaSocialVO();

				tarifaSocialVO.setId(tarifaSocial.getId());
				tarifaSocialVO.setInscricao(tarifaSocial.getInscricao());

				tarifaSocialVO
						.setConsumoMinimo(tarifaSocial.getConsumoMinimo());

				tarifaSocialVO.setCodigoTarifaSocial(tarifaSocial
						.getCodigoTarifaSocial());

				lstRetorno.add(tarifaSocialVO);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<TarifaVO> findTarifa(Long seqRoteiro) {
		Query query = entityManager.createQuery("SELECT tar "
				+ " FROM Tarifa tar INNER JOIN tar.carga car1 "
				+ " WHERE car1.id = (SELECT car2.id FROM Roteiro rot "
				+ " INNER JOIN rot.carga car2 WHERE rot.id =:id ) ");

		query.setParameter("id", seqRoteiro);

		List<br.com.ac.fatureweb.model.carga.Tarifa> resultList = query
				.getResultList();

		if (resultList != null && !resultList.isEmpty()) {

			List<TarifaVO> lstRetorno = new ArrayList<TarifaVO>();

			for (br.com.ac.fatureweb.model.carga.Tarifa tarifa : resultList) {

				TarifaVO tarifaVO = new TarifaVO();

				tarifaVO.setId(tarifa.getId());
				tarifaVO.setCodigo(tarifa.getCodigo());
				tarifaVO.setAno(tarifa.getAno());
				tarifaVO.setMes(tarifa.getMes());
				tarifaVO.setValorFixo(tarifa.getValorFixo());
				Double valorSemhidro = tarifa.getValorSemhidro() == null ? 0D
						: tarifa.getValorSemhidro();
				tarifaVO.setValorSemhidro(valorSemhidro);
				tarifaVO.setSigla(tarifa.getSigla());

				lstRetorno.add(tarifaVO);
			}

			return lstRetorno;
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	public List<FaixaVO> findFaixa(Long seqRoteiro) {

		Query query1 = entityManager.createQuery("SELECT fai FROM Faixa fai "
				+ " INNER JOIN FETCH fai.tarifa INNER JOIN fai.carga car1 "
				+ " WHERE car1.id = (SELECT car2.id FROM Roteiro rot "
				+ " INNER JOIN rot.carga car2 WHERE rot.id =:id ) ");

		query1.setParameter("id", seqRoteiro);

		List<Faixa> lstFaixa = query1.getResultList();

		if (lstFaixa != null && !lstFaixa.isEmpty()) {

			List<FaixaVO> lstRetorno = new ArrayList<FaixaVO>();

			for (Faixa faixa : lstFaixa) {

				FaixaVO faixaVO = new FaixaVO();

				faixaVO.setId(faixa.getId());
				faixaVO.setInicio(faixa.getInicio());
				faixaVO.setFim(faixa.getFim());
				faixaVO.setValor(faixa.getValor());
				faixaVO.setCobrancaMaxima(faixa.isCobrancaMaxima());
				faixaVO.setCodTarifa(faixa.getTarifa().getCodigo());

				lstRetorno.add(faixaVO);
			}

			return lstRetorno;
		}

		return null;
	}

}
